package com.acmen.easyapi.builder;


import com.acmen.easyapi.factory.ApiFactory;
import com.acmen.easyapi.model.Api;
import com.acmen.easyapi.model.RequestData;
import com.acmen.easyapi.model.Response;
import com.acmen.easyapi.util.AnnotationUtil;
import com.acmen.easyapi.util.SpringContextUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.List;

/**
 * @author acmen
 * 获取测试数据服务
 * @date 2022-03-16
 */
@RestController()
public class ApiTestController {
   @Resource
    private RequestDataBuilder requestDataBuilder;  // 注入RequestDataBuilder对象

    @GetMapping(value = "/api/create-test-data/{apiId}")
    public Response createTestData(@PathVariable String apiId) {
        Api api = null;  // 定义一个空的 Api 对象
        for (ApiFactory factory : SpringContextUtil.getBeans(ApiFactory.class)) {  // 遍历 ApiFactory 的 Bean
            if (factory.getApi(apiId) != null) {  // 如果 ApiFactory 中的 getApi 方法返回值不为空
                api = factory.getApi(apiId);  // 将 ApiFactory 中的 getApi 方法的返回值赋给 api
                break;  // 跳出循环
            }
        }
        if (api == null) {  // 如果 api 为空
            return Response.failure("接口不存在");  // 返回接口不存在的失败响应
        }
        Method method = api.getJavaMethod();  // 获取 api 对象中的 getJavaMethod 方法的返回值，并赋给 method
        List<List<Annotation>> parameterAnnotations = AnnotationUtil.getParameterAnnotations(method);  // 调用 AnnotationUtil 的 getParameterAnnotations 方法，将 method 的参数注解赋给 parameterAnnotations
        RequestData requestData = requestDataBuilder.buildData(method, parameterAnnotations);  // 调用 requestDataBuilder 的 buildData 方法，将 method 和 parameterAnnotations 作为参数，将构建的请求数据赋给 requestData
        return Response.of(requestData);  // 返回请求数据的成功响应
    }

}
